package main

import "fmt"

type person struct {
	name, superpower string
	age              int
}

func birthday(p *person) {
	p.age++
}
func birthday2(p person) {
	p.age++
}

// Go 语言的函数和方法都是按值传递参数的，这意味着函数总是操作于被传递参数的副本
// 当指针被传递到函数时，函数将接收传入的内存地址的副本。
// 之后函数可以通过解引用内存地址来修改指针指向的值
func main() {
	rebecca := person{
		name:       "Rebecca",
		superpower: "imagination",
		age:        14,
	}
	birthday2(rebecca)
	fmt.Printf("%+v\n", rebecca)

	// 函数总是操作于被传递参数的副本
	// 虽然 操作的是 指针的副本,但是是直接基于内存地址进行的操作
	birthday(&rebecca)
	fmt.Printf("%+v\n", rebecca)
}
